<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>JS变量提升</title>
</head>
<body>
  <p>什么是变量提升？</p>
  <ul>
    <li>JS首先会对整体脚本进行解析，会将所有的var定义的变量进行前置声明，也即"先声明后使用"</li>
    <li>对"先使用后声明"的var变量，当在未赋值之前的默认值为undefined, 且在全局环境下挂载window</li>
    <li>对"未声明"的var变量，JS将会解析编译不通过，将会抛出Uncaught ReferenceError，也不会执行对应的上下文</li>
    <li>在函数内部的var变量仍然会进行变量提升，但这并不是一个好的特性</li>
  </ul>
  <script>
    console.log(user); // undefined
    var user = 'Miracle';
    function getName() {
      console.log(user); // undefined
      var user = 'Miracle';
    }
    getName();
  </script>
</body>
</html>